package ig.metrica.riesgo;

import ig.finanzas.DefinidorCalculoCambioEsperado;
import ig.finanzas.TasaPK;
import ig.finanzas.riesgo.FactorRiesgoMatrizCorrelacion;
import ig.finanzas.riesgo.FactorRiesgoPersonal;
import ig.util.excepciones.DatoInvalidoExcepcion;

/**
 * Representa un factor de riesgo que se utiliza para el calculo del valor en riesgo. Generalmente 
 * un factor se asocia a un Contrato o a un tipo de Moneda para el calculo del riesgo en la tasa de
 * interes y el riesgo en la tasa de cambio, respectivamente.  
 * @author lfgarcia
 */
public class FactorRiesgoPersonalMetrica implements FactorRiesgoPersonal {

	/**
	 * @uml.property  name="tipo"
	 */
	private byte tipo;	
	/**
	 * @uml.property  name="tipoCalculoCambioEsperado"
	 */
	private byte tipoCalculoCambioEsperado;
	/**
	 * @uml.property  name="factorRiesgo"
	 * @uml.associationEnd  multiplicity="(1 1)"
	 */
	private FactorRiesgoMatrizCorrelacion factorRiesgo;
	/**
	 * @uml.property  name="tasaPK"
	 * @uml.associationEnd  
	 */
	private TasaPK tasaPK;
	/**
	 * @uml.property  name="definidor"
	 * @uml.associationEnd  multiplicity="(1 1)"
	 */
	private DefinidorCalculoCambioEsperado definidor;
	
        public FactorRiesgoPersonalMetrica(TasaPK tasaPK,FactorRiesgoMatrizCorrelacion factorRiesgo, 
			DefinidorCalculoCambioEsperado definidor,byte tipo) throws DatoInvalidoExcepcion{
		this.factorRiesgo = factorRiesgo;
		this.tipo = TIPO_FACTORTASA_DESCUENTO;
		this.tasaPK = tasaPK;
				
		if (definidor==null)
			this.tipoCalculoCambioEsperado = CAMBIOESPERADO_FACTORMATRIZ;
		else
			this.tipoCalculoCambioEsperado = CAMBIOESPERADO_SERIEVALORES;
		
		this.definidor = definidor;
        }
	/**
	 * Crea un Factor de Riesgo Personal del tipo Precio.
	 * @param factorRiesgo
	 * @param definidor
	 * @throws DatoInvalidoExcepcion
	 */
	public FactorRiesgoPersonalMetrica(FactorRiesgoMatrizCorrelacion factorRiesgo, 
			DefinidorCalculoCambioEsperado definidor) throws DatoInvalidoExcepcion{
		if (factorRiesgo==null)
			throw new DatoInvalidoExcepcion("El factor de riesgo de la matriz de correlacion asociada es nulo.");

		this.factorRiesgo = factorRiesgo;
		this.tipo = TIPO_FACTORPRECIO;
		this.tasaPK = null;

		if (definidor==null)
			this.tipoCalculoCambioEsperado = CAMBIOESPERADO_FACTORMATRIZ;
		else
			this.tipoCalculoCambioEsperado = CAMBIOESPERADO_SERIEVALORES;
		
		this.definidor = definidor;
	}
	
	/**
	 * Crea un Factor de Riesgo Personal del tipo Tasa.
	 * @param tasaPK
	 * @param factorRiesgo
	 * @param definidor
	 * @throws DatoInvalidoExcepcion Si la tasa o el factor de riesgo de la matriz de correlacion son nulos.
	 */
	public FactorRiesgoPersonalMetrica(TasaPK tasaPK, FactorRiesgoMatrizCorrelacion factorRiesgo, 
			DefinidorCalculoCambioEsperado definidor) throws DatoInvalidoExcepcion{
//		if (tasaPK==null)
//			throw new DatoInvalidoExcepcion("La tasa especificada es nula.");
		
//		if (factorRiesgo==null)
//			throw new DatoInvalidoExcepcion("El factor de riesgo de la matriz de correlacion asociada es nulo.");

		this.factorRiesgo = factorRiesgo;
		this.tipo = TIPO_FACTORTASA;
		this.tasaPK = tasaPK;
				
		if (definidor==null)
			this.tipoCalculoCambioEsperado = CAMBIOESPERADO_FACTORMATRIZ;
		else
			this.tipoCalculoCambioEsperado = CAMBIOESPERADO_SERIEVALORES;
		
		this.definidor = definidor;
	}

	//----------------------------------------------------------------------------------------------------------------
	
	public FactorRiesgoMatrizCorrelacion getFactorRiesgoMatrizCorrelacion() {
		return factorRiesgo;
	}
	
	public void setFactorRiesgoMatrizCorrelacion(FactorRiesgoMatrizCorrelacion factor) throws DatoInvalidoExcepcion{
		if (factor==null)
			throw new DatoInvalidoExcepcion("El factor de riesgo de la matriz de correlacion especificado es nulo.");
		this.factorRiesgo = (FactorRiesgoMatrizCorrelacionMetrica) factor;
	}

	//----------------------------------------------------------------------------------------------------------------
	
	/**
	 * @return  Returns the tipo.
	 * @uml.property  name="tipo"
	 */
	public byte getTipo() {
		return tipo;
	}
	
	public void setTipo(TasaPK tasaPK){
		
		if (tasaPK!=null)
			this.tipo = TIPO_FACTORTASA;
		else
			this.tipo = TIPO_FACTORPRECIO;
		
		this.tasaPK = tasaPK;
	}
	
	//----------------------------------------------------------------------------------------------------------------
	
	/**
	 * @return  Returns the tipoCalculoCambioEsperado.
	 * @uml.property  name="tipoCalculoCambioEsperado"
	 */
	public byte getTipoCalculoCambioEsperado() {
		return tipoCalculoCambioEsperado;
	}

	public DefinidorCalculoCambioEsperado getDefinidorCalculoCambioEsperado(){
		return definidor;
	}
	
	public void setDefinidorCalculoCambioEsperado(DefinidorCalculoCambioEsperado definidor){
		if (definidor==null)
			this.tipoCalculoCambioEsperado = CAMBIOESPERADO_FACTORMATRIZ;
		else
			this.tipoCalculoCambioEsperado = CAMBIOESPERADO_SERIEVALORES;
		
		this.definidor = definidor;
	}
	
	//----------------------------------------------------------------------------------------------------------------
	
	/**
	 * @return  Returns the tasaPK.
	 * @uml.property  name="tasaPK"
	 */
	public TasaPK getTasaPK() {
		return tasaPK;
	}

}
